char fbxshader_vert[] = "#version 450\n"
                        "#pragma import_defines ( VSG_NORMAL, VSG_TANGENT, VSG_COLOR, VSG_TEXCOORD0, VSG_LIGHTING, VSG_NORMAL_MAP, VSG_BILLBOARD, VSG_TRANSLATE )\n"
                        "#extension GL_ARB_separate_shader_objects : enable\n"
                        "layout(push_constant) uniform PushConstants {\n"
                        "    mat4 projection;\n"
                        "    mat4 modelView;\n"
                        "    //mat3 normal;\n"
                        "} pc;\n"
                        "layout(location = 0) in vec3 osg_Vertex;\n"
                        "#ifdef VSG_NORMAL\n"
                        "layout(location = 1) in vec3 osg_Normal;\n"
                        "layout(location = 1) out vec3 normalDir;\n"
                        "#endif\n"
                        "#ifdef VSG_TANGENT\n"
                        "layout(location = 2) in vec4 osg_Tangent;\n"
                        "#endif\n"
                        "#ifdef VSG_COLOR\n"
                        "layout(location = 3) in vec4 osg_Color;\n"
                        "layout(location = 3) out vec4 vertColor;\n"
                        "#endif\n"
                        "#ifdef VSG_TEXCOORD0\n"
                        "layout(location = 4) in vec2 osg_MultiTexCoord0;\n"
                        "layout(location = 4) out vec2 texCoord0;\n"
                        "#endif\n"
                        "#ifdef VSG_LIGHTING\n"
                        "layout(location = 5) out vec3 viewDir;\n"
                        "layout(location = 6) out vec3 lightDir;\n"
                        "#endif\n"
                        "#ifdef VSG_TRANSLATE\n"
                        "layout(location = 7) in vec3 translate;\n"
                        "#endif\n"
                        "\n"
                        "\n"
                        "out gl_PerVertex{ vec4 gl_Position; };\n"
                        "\n"
                        "void main()\n"
                        "{\n"
                        "    mat4 modelView = pc.modelView;\n"
                        "\n"
                        "#ifdef VSG_TRANSLATE\n"
                        "    mat4 translate_mat = mat4(1.0, 0.0, 0.0, 0.0,\n"
                        "                              0.0, 1.0, 0.0, 0.0,\n"
                        "                              0.0, 0.0, 1.0, 0.0,\n"
                        "                              translate.x,  translate.y,  translate.z, 1.0);\n"
                        "\n"
                        "    modelView = modelView * translate_mat;\n"
                        "#endif\n"
                        "\n"
                        "#ifdef VSG_BILLBOARD\n"
                        "    vec3 lookDir = vec3(-modelView[0][2], -modelView[1][2], -modelView[2][2]);\n"
                        "\n"
                        "    // rotate around local z axis\n"
                        "    float l = length(lookDir.xy);\n"
                        "    if (l>0.0)\n"
                        "    {\n"
                        "        float inv = 1.0/l;\n"
                        "        float c = lookDir.y * inv;\n"
                        "        float s = lookDir.x * inv;\n"
                        "\n"
                        "        mat4 rotation_z = mat4(c,   -s,  0.0, 0.0,\n"
                        "                               s,   c,   0.0, 0.0,\n"
                        "                               0.0, 0.0, 1.0, 0.0,\n"
                        "                               0.0, 0.0, 0.0, 1.0);\n"
                        "\n"
                        "        modelView = modelView * rotation_z;\n"
                        "    }\n"
                        "#endif\n"
                        "\n"
                        "    gl_Position = (pc.projection * modelView) * vec4(osg_Vertex, 1.0);\n"
                        "\n"
                        "#ifdef VSG_TEXCOORD0\n"
                        "    texCoord0 = osg_MultiTexCoord0.st;\n"
                        "#endif\n"
                        "#ifdef VSG_NORMAL\n"
                        "    vec3 n = (modelView * vec4(osg_Normal, 0.0)).xyz;\n"
                        "    normalDir = n;\n"
                        "#endif\n"
                        "#ifdef VSG_LIGHTING\n"
                        "    vec4 lpos = /*osg_LightSource.position*/ vec4(0.0, 0.25, 1.0, 0.0);\n"
                        "#ifdef VSG_NORMAL_MAP\n"
                        "    vec3 t = (modelView * vec4(osg_Tangent.xyz, 0.0)).xyz;\n"
                        "    vec3 b = cross(n, t);\n"
                        "    vec3 dir = -vec3(modelView * vec4(osg_Vertex, 1.0));\n"
                        "    viewDir.x = dot(dir, t);\n"
                        "    viewDir.y = dot(dir, b);\n"
                        "    viewDir.z = dot(dir, n);\n"
                        "    if (lpos.w == 0.0)\n"
                        "        dir = lpos.xyz;\n"
                        "    else\n"
                        "        dir += lpos.xyz;\n"
                        "    lightDir.x = dot(dir, t);\n"
                        "    lightDir.y = dot(dir, b);\n"
                        "    lightDir.z = dot(dir, n);\n"
                        "#else\n"
                        "    viewDir = -vec3(modelView * vec4(osg_Vertex, 1.0));\n"
                        "    if (lpos.w == 0.0)\n"
                        "        lightDir = lpos.xyz;\n"
                        "    else\n"
                        "        lightDir = lpos.xyz + viewDir;\n"
                        "#endif\n"
                        "#endif\n"
                        "#ifdef VSG_COLOR\n"
                        "    vertColor = osg_Color;\n"
                        "#endif\n"
                        "}\n"
                        "\n";
